package p.ithorns.framework.common.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * BigDecimalUtil
 *
 * @author ithorns
 * @version 1.0
 * @date 2020/12/22 18:23
 */
public class BigDecimalUtil {

    /**
     * 小数的精度
     */
    private static int precision = 2;

    /**
     * 两数相加
     *
     * @param b1 操作数1
     * @param b2 操作数2
     * @return 结果
     */
    public static BigDecimal add(BigDecimal b1, BigDecimal b2) {
        if (b1 == null) {
            b1 = new BigDecimal(0);
        }
        if (b2 == null) {
            b2 = new BigDecimal(0);
        }
        return b1.add(b2);
    }

    /**
     * 两数相减
     *
     * @param b1 操作数1
     * @param b2 操作数2
     * @return 结果
     */
    public static BigDecimal subtract(BigDecimal b1, BigDecimal b2) {
        if (b1 == null) {
            b1 = new BigDecimal(0);
        }
        if (b2 == null) {
            b2 = new BigDecimal(0);
        }
        return b1.subtract(b2);
    }

    /**
     * 两数相乘
     *
     * @param b1 操作数1
     * @param b2 操作数2
     * @return 结果
     */
    public static BigDecimal multiply(BigDecimal b1, BigDecimal b2) {
        if (b1 == null) {
            b1 = new BigDecimal(0);
        }
        if (b2 == null) {
            b2 = new BigDecimal(0);
        }
        return b1.multiply(b2).setScale(precision, RoundingMode.HALF_UP);
    }

    /**
     * 两数相乘
     *
     * @param b1 操作数1
     * @param b2 操作数2
     * @return 结果
     */
    public static BigDecimal multiply(BigDecimal b1, BigDecimal b2, int scale) {
        if (b1 == null) {
            b1 = new BigDecimal(0);
        }
        if (b2 == null) {
            b2 = new BigDecimal(0);
        }
        return b1.multiply(b2).setScale(scale, RoundingMode.HALF_UP);
    }

    /**
     * 大于
     *
     * @param b1 操作数1
     * @param b2 操作数2
     * @return 结果
     */
    public static boolean greaterThan(BigDecimal b1, BigDecimal b2) {
        if (b1 == null) {
            b1 = new BigDecimal(0);
        }
        if (b2 == null) {
            b2 = new BigDecimal(0);
        }
        return b1.compareTo(b2) > 0;
    }

    /**
     * 大于或等于
     *
     * @param b1 操作数1
     * @param b2 操作数2
     * @return 结果
     */
    public static boolean greaterOrEquals(BigDecimal b1, BigDecimal b2) {
        if (b1 == null) {
            b1 = new BigDecimal(0);
        }
        if (b2 == null) {
            b2 = new BigDecimal(0);
        }
        return b1.compareTo(b2) >= 0;
    }

    /**
     * 小于
     *
     * @param b1 操作数1
     * @param b2 操作数2
     * @return 结果
     */
    public static boolean lessThan(BigDecimal b1, BigDecimal b2) {
        if (b1 == null) {
            b1 = new BigDecimal(0);
        }
        if (b2 == null) {
            b2 = new BigDecimal(0);
        }
        return b1.compareTo(b2) < 0;
    }

    /**
     * 小于或等于
     *
     * @param b1 操作数1
     * @param b2 操作数2
     * @return 结果
     */
    public static boolean lessOrEquals(BigDecimal b1, BigDecimal b2) {
        if (b1 == null) {
            b1 = new BigDecimal(0);
        }
        if (b2 == null) {
            b2 = new BigDecimal(0);
        }
        return b1.compareTo(b2) <= 0;
    }

    /**
     * 等于
     *
     * @param b1 操作数1
     * @param b2 操作数2
     * @return 结果
     */
    public static boolean equals(BigDecimal b1, BigDecimal b2) {
        if (b1 == null) {
            return false;
        }
        if (b2 == null) {
            return false;
        }
        return b1.compareTo(b2) == 0;
    }

    /**
     * 除法，默认留5位小数
     *
     * @param b1 操作数1
     * @param b2 操作数2
     * @return BigDecimal
     */
    public static BigDecimal divide(BigDecimal b1, BigDecimal b2) {
        if (b1 == null) {
            return new BigDecimal(0);
        }
        if (b2 == null || equals(b2, new BigDecimal(0))) {
            // throw new ArithmeticException("b2 is zero !");
            return new BigDecimal(0);
        }
        return b1.divide(b2, precision, RoundingMode.HALF_UP);
    }

    /**
     * 除法（需要给定小数位数）
     *
     * @param b1 操作数1
     * @param b2 操作数2
     * @return BigDecimal
     */
    public static BigDecimal divide(BigDecimal b1, BigDecimal b2, int scale) {
        if (b1 == null) {
            return new BigDecimal(0);
        }
        if (b2 == null || equals(b2, new BigDecimal(0))) {
            //throw new ArithmeticException("b2 is zero ! ");
            return new BigDecimal(0);
        }
        return b1.divide(b2, scale, RoundingMode.HALF_UP);
    }

    public static BigDecimal percent(BigDecimal b1, BigDecimal b2) {
        return divide(multiply(subtract(b1, b2), new BigDecimal(100)), b2, 2);
    }

}
